package com.bos.report.factory;

import com.bos.dao.SekolahDAO;
import com.bos.domain.Anggaran;
import com.bos.domain.JumlahSiswa;
import com.bos.domain.Sekolah;
import com.bos.report.model.DayaSerap;
import com.bos.util.NumberUtil;
import com.bos.util.enums.JenjangSekolah;
import com.bos.util.enums.SatuanPendidikan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by IntelliJ IDEA.
 * User: Latief
 * Date: 5/26/11
 * Time: 9:29 PM
 * To change this template use File | Settings | File Templates.
 */
@Repository
public class DayaSerapFactory extends ReportFactory<DayaSerap> {

    public final static String KEY_PERIODE = "periode";
    public final static String KEY_TOTAL_SISWA = "totalSiswa";
    public final static String KEY_TOTAL_ALOKASI = "totalAlokasi";
    public final static String KEY_TOTAL_REALISASI = "totalRealisasi";
    public final static String KEY_NAMA_KAB = "namaKab";
    public final static String KEY_KAB_KOTA = "kabkota";
    public final static String KEY_TANGGAL = "tanggal";
    public final static String KEY_NAMA = "nama";
    public final static String KEY_NIP = "nip";
    public final static String KEY_JABATAN = "jabatan";

    /**
     * Digunakan untuk mengambil data Sekolah sebagai acuan data source.
     */
    private SekolahDAO sekolahDAO;

    public DayaSerapFactory() {
        super();
        responseParameter.put(KEY_NAMA, "DRS. SOFYAN SULAIMAN");
        responseParameter.put(KEY_JABATAN, "Kepala Dinas Pendidikan,Pemuda dan Olahraga");
        responseParameter.put(KEY_NIP, "19530811 198103 1 007");
    }

    /**
     * Ambil data sekolah dari database berdasarkan JenjangSekolah. Digunakan sebagai data acuan untuk memapping data source.
     *
     * @param jenjangSekolah
     * @return
     */
    protected List<Sekolah> loadReferenceDataSource(JenjangSekolah jenjangSekolah) {
        return sekolahDAO.findByJenjangSekolah(jenjangSekolah);
    }

    /**
     * Melakukan mapping sekolahReferenceList ke mapDataSource.
     *
     * @param jenjangSekolah
     * @return
     */
    protected Map<String, DayaSerap> mappingReferenceDataSource(JenjangSekolah jenjangSekolah) {
        //ambil sekolahReferenceList.
        List<Sekolah> sekolahReferenceList = loadReferenceDataSource(jenjangSekolah);

        //lakukan mapping berdasarkan npsn sekolah.
        Map<String, DayaSerap> mapDataSource = new HashMap<String, DayaSerap>();
        for (Sekolah sekolah : sekolahReferenceList) {
            DayaSerap dayaSerap = new DayaSerap();
            dayaSerap.setIdentitas(sekolah.getNpsn());
            dayaSerap.setJenjangSekolah(sekolah.getJenjangSekolah() + "");
            dayaSerap.setNama(sekolah.getNama());
            dayaSerap.setKecamatan(sekolah.getKelurahan().getKecamatan().getNama());
            dayaSerap.setNegeri("-");
            dayaSerap.setSwasta("-");
            if (sekolah.getSatuanPendidikan() == SatuanPendidikan.NEGERI)
                dayaSerap.setNegeri("N");
            if (sekolah.getSatuanPendidikan() == SatuanPendidikan.SWASTA)
                dayaSerap.setSwasta("S");
            dayaSerap.setJumlahSiswa("0");
            dayaSerap.setAlokasi("0");
            dayaSerap.setRealisasi("0");
            dayaSerap.setPersentase("");
            dayaSerap.setKeterangan("-");

            mapDataSource.put(sekolah.getNpsn(), dayaSerap);
        }

        return mapDataSource;
    }

    /**
     * Konversikan mapping data source ke dalam List datasource.
     *
     * @param mapDataSource
     */
    protected void convertMapDataSourceToDataSource(Map<String, DayaSerap> mapDataSource) {
        dataSource = new ArrayList<DayaSerap>();

        if (mapDataSource == null)
            return;

        //Konversikan ke List data source
        dataSource.addAll(mapDataSource.values());
    }

    public void fillDataSource(JenjangSekolah jenjangSekolah, List<Anggaran> anggarans, List<JumlahSiswa> jumlahSiswas) {
        Map<String, DayaSerap> mapDataSource = null;
        if (jenjangSekolah != null) {

            //ambil mapping data source
            mapDataSource = mappingReferenceDataSource(jenjangSekolah);

            //Isikan alokasi anggaran ke map datasource yang sesuai.
            if (anggarans != null) {
                long sumAlokasi = 0;
                long sumRealisasi = 0;
                for (Anggaran anggaran : anggarans) {
                    DayaSerap dayaSerap = mapDataSource.get(anggaran.getSekolah().getNpsn());
                    dayaSerap.setAlokasi(NumberUtil.convertToNumberSeparator(anggaran.getKucuran()));
                    dayaSerap.setRealisasi(NumberUtil.convertToNumberSeparator(anggaran.getRealisasi()));
                    int persentase = (int) ((float)anggaran.getRealisasi()/(float)anggaran.getKucuran() * 100f);
                    dayaSerap.setPersentase(persentase + "");

                    sumAlokasi += anggaran.getKucuran();
                    sumRealisasi += anggaran.getRealisasi();
                }

                putResponseParameter(KEY_TOTAL_ALOKASI, NumberUtil.convertToNumberSeparator(sumAlokasi));
                putResponseParameter(KEY_TOTAL_REALISASI, NumberUtil.convertToNumberSeparator(sumRealisasi));
            }

            //Isikan jumlah siswa ke map datasource yang sesuai
            if (jumlahSiswas != null) {
                int sumSiswa = 0;
                for (JumlahSiswa jumlahSiswa : jumlahSiswas) {
                    DayaSerap dayaSerap = mapDataSource.get(jumlahSiswa.getSekolah().getNpsn());

                    int jml = jumlahSiswa.getKelas1L() + jumlahSiswa.getKelas1P() + jumlahSiswa.getKelas2L()
                            + jumlahSiswa.getKelas2P() + jumlahSiswa.getKelas3L() + jumlahSiswa.getKelas3P()
                            + jumlahSiswa.getKelas4L() + jumlahSiswa.getKelas4P() + jumlahSiswa.getKelas5L()
                            + jumlahSiswa.getKelas5P() + jumlahSiswa.getKelas6L() + jumlahSiswa.getKelas6P()
                            + jumlahSiswa.getKelas7L() + jumlahSiswa.getKelas7P() + jumlahSiswa.getKelas8L()
                            + jumlahSiswa.getKelas8P() + jumlahSiswa.getKelas9L() + jumlahSiswa.getKelas9P();
                    sumSiswa += jml;

                    dayaSerap.setJumlahSiswa(jml + "");
                }

                putResponseParameter(KEY_TOTAL_SISWA, NumberUtil.convertToNumberSeparator(sumSiswa));
            }
        }

        //Konversikan map data source ke dalam List data source
        convertMapDataSourceToDataSource(mapDataSource);

        putResponseParameter(KEY_DATASOURCE_SIZE, dataSource.size() + "");
    }


    @Autowired
    public void setSekolahDAO(SekolahDAO sekolahDAO) {
        this.sekolahDAO = sekolahDAO;
    }
}
